package ar.frba.utn.diseñosistemas.Tests.TP2;

import java.util.ArrayList;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import ar.frba.utn.diseñosistemas.TP2.*;

public class TestUsuario {

	Usuario standar;
	Usuario vip;
	Usuario gratuito;
	
	Busqueda unaBusqueda;
	
	IBuscador busquedaConAsientosMuyCaros;
	
	@Before
	public void setUp() throws Exception {
		
		standar = new Usuario("Pablo", "Marcobielo", "32664183", new Standar(standar));
		vip = new Usuario("Marcela", "Paino", "22739007", new VIP(vip));
		gratuito = new Usuario("Sebastian", "Derecho", "31778042", new Gratuito(gratuito));
		
		unaBusqueda = new Busqueda("BS", "SLA", "02-11-2012", null, null, null, null, null, null, 0);
		
		ArrayList<Aerolinea> mocks = new ArrayList<Aerolinea>();
		mocks.add(new AerolineaMock());
		AterrizarSingleton.getInstance().setAerolineas(mocks);
		
		busquedaConAsientosMuyCaros = new BuscadorBuilder()
										.agregarRecargo(100000)
										.Construir();
	}
	
	@Test
	public void guardarBusquedaConUsuarioStandar()
	{
		standar.Buscar(unaBusqueda);
		
		Assert.assertTrue(standar.getBusquedasGuardadas().contains(unaBusqueda));
	}
	@Test
	public void guardarBusquedaConUsuarioVIP()
	{
		vip.Buscar(unaBusqueda);
		
		Assert.assertTrue(vip.getBusquedasGuardadas().contains(unaBusqueda));
	}
	@Test
	public void guardarBusquedaConUsuarioGratuito()
	{
		gratuito.Buscar(unaBusqueda);
		
		Assert.assertTrue(gratuito.getBusquedasGuardadas().contains(unaBusqueda));
	}

	@Test
	public void buscarYComprarConUsuarioStandar()
	{
		ArrayList<Itinerario> itinerarios = standar.Buscar(unaBusqueda);
		Itinerario itinerarioAComprar = itinerarios.get(0);
		Asiento asientoAComprar = itinerarioAComprar.getAsientos().get(0);
		
		standar.Comprar(itinerarioAComprar);
		
		Assert.assertTrue(standar.getAsientosComprados().contains(asientoAComprar));
	}
	@Test
	public void buscarYComprarConUsuarioVIP()
	{
		ArrayList<Itinerario> itinerarios = vip.Buscar(unaBusqueda);
		Itinerario itinerarioAComprar = itinerarios.get(0);
		Asiento asientoAComprar = itinerarioAComprar.getAsientos().get(0);
		
		vip.Comprar(itinerarioAComprar);
		
		Assert.assertTrue(vip.getAsientosComprados().contains(asientoAComprar));
	}
	@Test
	public void buscarYComprarConUsuarioGratis()

	
	{
		ArrayList<Itinerario> itinerarios = gratuito.Buscar(unaBusqueda);
		Itinerario itinerarioAComprar = itinerarios.get(0);
		Asiento asientoAComprar = itinerarioAComprar.getAsientos().get(0);
		
		gratuito.Comprar(itinerarioAComprar);
		
		Assert.assertTrue(gratuito.getAsientosComprados().contains(asientoAComprar));
	}

	@Test
	public void transformarUsuarioStandarEnVIP()
	{
		unaBusqueda.setOrdenamiento(new PorPrecioDescendente());
		Itinerario itinerarioMuyCaro = busquedaConAsientosMuyCaros.Buscar(unaBusqueda).get(0);
		standar.Comprar(itinerarioMuyCaro);
		
		Assert.assertTrue(standar.getTipoUsuario() instanceof VIP);
	}
	
	@Test
	public void buscarComoStandarFiltraSuperOfertas()
	{
		ArrayList<Itinerario> itinerarios = standar.Buscar(unaBusqueda);
		for (Itinerario itinerario : itinerarios){
			for (Asiento asiento : itinerario.getAsientos()) {
				Assert.assertFalse(asiento.esSuperOferta());
			}
		}
	}
	@Test
	public void buscarComoGratuitoFiltraSuperOfertas()
	{
		ArrayList<Itinerario> itinerarios = gratuito.Buscar(unaBusqueda);
		
		for (Itinerario itinerario : itinerarios){
			for (Asiento asiento : itinerario.getAsientos()) {
				Assert.assertFalse(asiento.esSuperOferta());
			}
		}
	}
	@Test
	public void buscarComoVIPTraeSuperOfertas()
	{
		ArrayList<Itinerario> itinerarios = vip.Buscar(unaBusqueda);
		
		for (Itinerario itinerario : itinerarios){
			for (Asiento asiento : itinerario.getAsientos()) {
				if(asiento.esSuperOferta())
					return;
			}
		}
		
		Assert.fail();
	}
}
